#ifndef PARABOLIC_H
#define PARABOLIC_H

#include <algorithm/shared/data/topology/geometry/Geometry.h>
#include <algorithm/shared/utils/Vec2.h>
#include <utils/ParaUtils.h>

#include <boost/describe.hpp>

namespace solar
{
    // 抛物面:z=x^2/a^2 + y^2/b^2
    class Parabolic : public Geometry
    {
        public:
            Parabolic(double a = 1, double b = 1) : a_(a), b_(b) {}
            [[nodiscard]] auto getType() const -> GeometryType override { return type_; }
#include <utils/class_name.inc>

        private:
            double a_;
            double b_;
            Vec2 size_; // 在投影面的长和宽

            GeometryType type_ = GeometryType::kGeometryParabolic;
            BOOST_DESCRIBE_CLASS(Parabolic, (Geometry), (), (), (a_, b_, size_, type_))
    };
} // namespace solar
#define CURRENT_CLASS_NAME Parabolic
#include <utils/class_describe_header.inc>
SOLAR_DESCRIBE_CLASS(Parabolic, (Geometry), (), (), (a_, b_, size_, type_))
#endif
